CFB ストレージ消し飛んだ…

問題名

ストレージ消し飛んだ…

概要

運用していたzfsストレージサーバが故障してしまったらしい。
幸いsnapshotの出力、backup scriptのバックアップは残っているため、復元が可能だと考えられる。
いい感じに元の状態に復元してほしい。

前提条件

  • バックアップは一週間に一度取られていた。
  • 運用初週は/home/user/first_script.shを実行した。
  • 二周目以降は/home/user/diff_script.shを実行していた。
  • スクリプトは故障前の環境のバックアップから復元しているだけなのでスクリプト内のパスなどがずれている可能性がある。

制約

初期状態

  • zpoolは作成済みであり、正常な状態(failしていない)である。
  • バックアップ出力は/home/user/backupsにまとめてある
  • 前提条件に記載してあるとおり、バックアップスクリプトは/home/user/ に置いてある。

終了状態

  • /home/user/backupsのbackupをpool名zpoolのデータセットstorage にすべて復元出来ている。
  • 確認のためにtree .などを使うこと
  • 復元のために作成、実行したスクリプト、コマンドなどの詳細を解答として送信すること

解説

/home/userに配置してある以下のスクリプトを読み、それに対応したコマンドを実行する必要があります。

first_script.sh

#!/bin/bash

function getSnapshot() {
  zfs snapshot zpool/daily_backup@"$1"
}

function sendSnapshot() {
  zfs send zpool/daily_backup@"$1" | pigz -c | openssl enc -iter 100  -aes-256-cbc -e -k ictsc2022 > /home/ictsc/"$1".enc
}

function main() {
    today=$(date +"%Y-%m-%d")
    getSnapshot "$today"
    sendSnapshot "$today"
}

main

diff_script.sh

#!/bin/bash

function getSnapshot() {
  zfs snapshot zpool/daily_backup@"$1"
}

function sendSnapshot() {
  echo zpool/daily_backup@"$1"
  echo zpool/daily_backup@"$2"
  zfs send -i zpool/daily_backup@"$1" zpool/daily_backup@"$2" | pigz -c | openssl enc -iter 100  -aes-256-cbc -e -k ictsc2022 > /home/ictsc/"$1"-to-"$2".enc
}

function main() {
    today=$(date +"%Y-%m-%d")
    lastweek=$(date +"%Y-%m-%d" --date '7 day ago')
    getSnapshot "$today"
    sendSnapshot "$lastweek" "$today"
}

main

first_script.shdiff_script.shの違いは初回用とそれ以降の差分バックアップ用の違いです。
どちらも圧縮、暗号化を経てバックアップを出力しておりバックアップファイルに展開、復号を行う必要があります。

想定していた解法

  • ワンライナーの復元コマンドを作成し、実行する、

採点基準

  • スナップショットを確認し、リカバリが出来ているか(100%)

講評

解答を提出したチームがあまり多くありませんでした。
提出された解答の正答率は100%で、zfsのsnapshotの知識があると解きやすい問題だったかと思います。

模範解答

/home/user/backupsに移動し、

openssl enc -aes-256-cbc -iter 100 -d -pass pass:ictsc2022 -in ./2022-12-03.enc | pigz -d | sudo zfs receive -F zpool/storage
openssl enc -aes-256-cbc -iter 100 -d -pass pass:ictsc2022 -in ./2022-12-03-to-2022-12-10.enc | pigz -d | sudo zfs receive -F zpool/storage
openssl enc -aes-256-cbc -iter 100 -d -pass pass:ictsc2022 -in ./2022-12-10-to-2022-12-17.enc | pigz -d | sudo zfs receive -F zpool/storage
openssl enc -aes-256-cbc -iter 100 -d -pass pass:ictsc2022 -in ./2022-12-17-to-2022-12-24.enc | pigz -d | sudo zfs receive -F zpool/storage
openssl enc -aes-256-cbc -iter 100 -d -pass pass:ictsc2022 -in ./2022-12-24-to-2022-12-31.enc | pigz -d | sudo zfs receive -F zpool/storage

を実行することで復元が可能です。